<?php

/**
 * Unidad form.
 *
 * @package    sistema_estadisticas
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class UnidadForm extends BaseUnidadForm
{

	public function configure()
	{
		$this->widgetSchema['modulo_id'] = new sfWidgetFormInputHidden();
		$this->widgetSchema['caracteristica'] = new sfWidgetFormChoice(array('choices' => Constantes::$CARACTERISTICAS));

		$actual = $this->getObject();
		$table = UnidadTable::getInstance();
		$lista_unidades = $table->findByMallaId($actual->getModulo()->getMallaId());

		$pre_requisito = array();
		$co_requisito = array();

		foreach ($lista_unidades as $unidad)
		{
			if ($actual->getModulo()->getNumero() > $unidad[2])
				$pre_requisito[$unidad[0]] = sprintf('%s (Módulo %d)', $unidad[1], $unidad[2]);
			else if ($actual->getModulo()->getNumero() == $unidad[2] && $actual->getId() != $unidad[0])
				$co_requisito[$unidad[0]] = sprintf('%s (Módulo %d)', $unidad[1], $unidad[2]);
		}

		$this->validatorSchema['creditos'] = new sfValidatorInteger();

		$this->widgetSchema['unidad_prerequisito'] =  new sfWidgetFormSelectDoubleList(
			array(
				'label' => 'Prerequisitos', 
				'associated_first' =>false,
				'label_unassociated' => 'No asociado',
				'label_associated' => 'Asociado',
				'choices' => $pre_requisito,
				'unassociate' => '<span class="double_list_unassociate" title="Quitar"></span>',
				'associate' => '<span class="double_list_associate" title="Agregar"></span>',
			)
		);

		$this->widgetSchema['unidad_corequisito'] =  new sfWidgetFormSelectDoubleList(
			array(
				'label' => 'Corequisitos',
				'associated_first' => false, 
				'label_unassociated' => 'No asociado',
				'label_associated' => 'Asociado',
				'choices' => $co_requisito,
				'unassociate' => '<span class="double_list_unassociate" title="Quitar"></span>',
				'associate' => '<span class="double_list_associate" title="Agregar"></span>',
			)
		);

		$this->validatorSchema['unidad_prerequisito'] = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'Unidad', 'required' => false));
		$this->validatorSchema['unidad_corequisito'] = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'Unidad', 'required' => false));
	}

	public function doSave($con = null)
	{
		if (null === $con)
			$con = $this->getConnection();
			
		$this->updateObject();

		$this->savePrerequisito($con);
		$this->saveCorequisito($con);
		$this->getObject()->save($con);
	}

	private function saveCorequisito($con)
	{
		$values = $this->values['unidad_corequisito'];
		$current = $this->getObject()->getCorequisitoValues();
		
		if (!is_array($values))
			$values = array();
		
		$unlink = array_diff($current, $values);
		$link = array_diff($values, $current);

		foreach ($link as $id)
		{
			$tmp = new UnidadCorequisito();
			$tmp->setUnidadId($this->getObject()->getId());
			$tmp->setCorequisitoId($id);
			$this->getObject()->getUnidadCorequisito()->add($tmp);
		}

		foreach ($this->getObject()->getUnidadCorequisito() as $key => $record)
		{
			if (in_array($record->getCorequisitoId(), $unlink))
			{
				$this->getObject()->getUnidadCorequisito()->remove($key);
			}
		}

		if (!$this->isNew()) //auditoria entidad 
		{
			if (!empty($link) || !empty($unlink))
				$this->getObject()->state(Doctrine_Record::STATE_DIRTY);
		}
	}
	
	private function savePrerequisito($con)
	{
		$values = $this->values['unidad_prerequisito'];
		$current = $this->getObject()->getPrerequisitoValues();

		if (!is_array($values))
			$values = array();
		
		$unlink = array_diff($current, $values);
		$link = array_diff($values, $current);

		foreach ($link as $id)
		{
			$tmp = new UnidadPrerequisito();
			$tmp->setUnidad($this->getObject());
			$tmp->setPrerequisitoId($id);
			$this->getObject()->getUnidadPrerequisito()->add($tmp);
		}
		
		foreach ($this->getObject()->getUnidadPrerequisito() as $key => $record)
		{
			if (in_array($record->getPrerequisitoId(), $unlink))
			{
				$this->getObject()->getUnidadPrerequisito()->remove($key);
			}
		}

		if (!$this->isNew()) //auditoria entidad
		{
			if (!empty($link) || !empty($unlink))
				$this->getObject()->state(Doctrine_Record::STATE_DIRTY);
		}
	}

}
